/**
 * 
 */
package org.iamd.web.ui.generator;

import javax.el.MethodExpression;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.event.ActionListener;
import org.ajax4jsf.component.html.HtmlActionParameter;
import org.ajax4jsf.component.html.HtmlAjaxCommandLink;
import org.iamd.web.util.ManagedBeans;

/**
 * Клас, който предоставя услуги за динамично генериране на интерфейсни
 * компоненти.
 * 
 * @author Mim
 */
public class UIGenerator extends UIBaseGenerator {

	private static String ID_PREFIX_PANEL = "pnl_";

	private static String ID_PREFIX_LINK = "lnk_";

	private static String ID_PREFIX_PARAM = "prm_";

	/**
	 * Генерира визуален компонент, съответстващ на <code>h:panelGrid</code>
	 * 
	 * @param id
	 *            - идентификатор
	 * @return javax.faces.component.html.HtmlPanelGrid
	 */
	public HtmlPanelGrid genHPanelGrid(String id) {
		HtmlPanelGrid comp = new HtmlPanelGrid();
		setId(comp, ID_PREFIX_PANEL + id);
		return comp;
	}

	/**
	 * Генерира визуален компонент, съответстващ на <code>aj4:commandLink</code>
	 * 
	 * @param id
	 *            - идентификатор на компонент
	 * @param label
	 *            - етикет на компонент
	 * @param action
	 * <br>
	 *            - <code>MethodExpression action</code> - метод, който се
	 *            извиква при клик на компонента <br>
	 *            - <code>null</code> - параметърът се игнорира <br>
	 * @param listener
	 * <br>
	 *            - <code>ActionListener listener</code> - лисънър, който се
	 *            извиква при клик на компонента <br>
	 *            - <code>null</code> - параметърът се игнорира <br>
	 * @param ajaxSingle
	 * <br>
	 *            - <code>true</code> - реагира само на Ajax request - и <br>
	 *            - <code>false</code> - реагира на всички request - и <br>
	 *            - <code>null</code> - параметърът се игнорира <br>
	 * @param rendered
	 * <br>
	 *            - <code>true</code> - компонентът се визуализира <br>
	 *            - <code>false</code> - компонентът не се визуализира <br>
	 *            - <code>null</code> - параметърът се игнорира <br>
	 * @param reRender
	 * <br>
	 *            - <code>String reRender</code> - идентификатор на компонент,
	 *            който трябва да се опресни <br>
	 *            - <code>null</code> - параметърът се игнорира <br>
	 * @return org.ajax4jsf.component.html.HtmlAjaxCommandLink
	 */
	public HtmlAjaxCommandLink getA4JCommandLInk(String id, String label, String title,
			UIComponent parent, MethodExpression action, ActionListener listener,
			Boolean ajaxSingle, Boolean rendered, String reRender) {
		HtmlAjaxCommandLink comp = (HtmlAjaxCommandLink) createComponent(HtmlAjaxCommandLink.COMPONENT_TYPE);
		setId(comp, ID_PREFIX_LINK + id);
		setValue(comp, label);
		setTitle(comp, title);
		setParent(comp, parent);
		addActionListener(comp, listener);
		addAction(comp, action);
		setRendered(comp, rendered);
		setAjaxSingle(comp, ajaxSingle);
		setReRender(comp, reRender);
		return comp;
	}

	/**
	 * Генерира javax.el.MethodExpression
	 * 
	 * @param method
	 *            - име на публичен метод
	 * @param mb
	 *            - MB, в който се намира метода
	 * @return javax.el.MethodExpression
	 */
	public MethodExpression getMethodExpression(String method, ManagedBeans mb) {
		return generateMethodExpression(generateExpressionString(method, mb));
	}

	/**
	 * Генерира визуален компонент, съответстващ на <code>a4j:actionparam</code>
	 * 
	 * @param id
	 *            - идентификатор на компонент
	 * @param name
	 *            - име на параметър
	 * @param value
	 *            - стойност на параметър
	 * @param assignToExpr
	 *            - име на сетър, на който да бъде присвоена стойността при
	 *            кликане на компонента, в който се намира параметъра
	 * @param mb
	 *            - MB, в който се намира сетъра
	 * @param parent
	 *            - компонент - родител на параметъра
	 * @return org.ajax4jsf.component.html.HtmlActionParameter
	 */
	public HtmlActionParameter getUIActionParameter(String id, String name, String value,
			String assignToExpr, ManagedBeans mb, UIComponent parent) {
		HtmlActionParameter comp = new HtmlActionParameter();
		setId(comp, ID_PREFIX_PARAM + id);
		setParent(comp, parent);
		comp.setName(name);
		comp.setValue(value);
		comp.setAssignToBinding(generateValueExpression(generateExpressionString(assignToExpr, mb)));
		return comp;
	}
}
